"""
本算法将被测对象的一组（50个）电流值数据存储于float型数组Irms中，
通过比较这一组数据的平均数、中位数和众数三者之间的差值，
若差值的绝对值都在预设的正态分布置信区间之内，则判断符合正态分布输出1，反之则不符合输出0。
"""
import pandas as pd
from ctypes import c_float

def average(Irms):
    return sum(Irms) / len(Irms)

def median(Irms):
    sorted_Irms = sorted(Irms)
    mid = len(Irms) // 2
    return (sorted_Irms[mid] + sorted_Irms[mid - 1]) / 2 if len(Irms) % 2 == 0 else sorted_Irms[mid]

def mode(Irms):
    frequency_dict = {}
    for value in Irms:
        frequency_dict[value] = frequency_dict.get(value, 0) + 1

    max_freq = max(frequency_dict.values())
    mode_values = [key for key, value in frequency_dict.items() if value == max_freq]

    return mode_values[0]

def normal_distribution_test(Irms, dev):
    ave = average(Irms)
    med = median(Irms)
    mod = mode(Irms)
    ave_med = abs(ave - med)
    ave_mod = abs(ave - mod)
    med_mod = abs(med - mod)

    if ave_med > dev or ave_mod > dev or med_mod > dev:
        return 0
    else:
        return 1


def normal_distribution_test_route(data_path):
    suffix = data_path.split(".")[1]
    # 如果输入文件是xlsx格式的。
    if suffix == "xlsx":
        data = pd.read_excel(data_path)
        Irms = data["Irms"].to_list()
        # 将Python中的列表转换为C语言中的数组
        Irms_array = (c_float * len(Irms))(*Irms)
        # 调用算法
        ans = normal_distribution_test(Irms_array, 0.5)
        # 输出算法结果
        # print(ans)
        ans = [[{'正太分布情况': ans}]]
        return ans

    #如果输入文件是txt格式的。
    if suffix == "txt":
        power = []
        Irms = []
        with open(data_path, "r", encoding='utf-8') as file:
            for line in file:
                if line.startswith("Irms:") and line.count(';') == 1:
                    #筛选并存储算法输入数据
                    parts = line.strip().split(';')
                    Irms.append(float(parts[0].split(':')[1]))

        #将Python中的列表转换为C语言中的数组
            Irms_array = (c_float * len(Irms))(*Irms)
        #调用算法
            ans = normal_distribution_test(Irms_array, 0.5)
        #输出算法结果
            # print(ans)
            ans = [[{'正太分布情况': ans}]]
            return ans

if __name__ == "__main__":
    # 读取文件路径
    # data_path = 'input_normal.xlsx'
    data_path = 'input_unnormal.xlsx'
    ans = normal_distribution_test_route(data_path)

    # 输出ans: #正态分布状态(1-正态;0-非正态)。
    print('ans:', ans)

